package com.chujian.framework.core.tsdata;

import java.io.Serializable;
import java.util.Map;

/**
 * 通用数据传输对象定义
 */
public interface ITsData<T> {

    /**
     * 数据标识，一般用于逻辑判断
     *
     * @return 数据标识
     */
    Serializable getDataMark();

    /**
     * @param dataMark dataMark
     * @return ITsData
     */
    ITsData<T> setDataMark(Serializable dataMark);

    /**
     * 数据ID，数据主键ID
     *
     * @return 数据ID
     */
    Serializable getDataId();

    /**
     * 设置数据主键ID
     *
     * @param dataId dataId
     * @return ITsData
     */
    ITsData<T> setDataId(Serializable dataId);

    /**
     * 获取元数据
     *
     * @return TsDataMeta
     */
    TsDataMeta getMeta();

    /**
     * 设置元数据
     *
     * @param meta meta
     * @return ITsData
     */
    ITsData<T> setMeta(TsDataMeta meta);

    /**
     * 获取原信息
     *
     * @param key key
     * @return Object
     */
    Object getMeta(String key);

    /**
     * 添加元信息
     *
     * @param key key
     * @param obj obj
     * @return ITsData
     */
    ITsData<T> addMeta(String key, Object obj);

    /**
     * 消息体
     *
     * @return 消息体
     */
    T getPayload();

    /**
     * 设置载体数据
     *
     * @param payload payload
     * @return ITsData
     */
    ITsData<T> setPayload(T payload);

    /**
     * 获取创建时间
     *
     * @return creTime
     */
    Long getCreTime();

    /**
     * 设置数据创建时间
     *
     * @param creTime creTime
     * @return ITsData
     */
    ITsData<T> setCreTime(Long creTime);

    /**
     * 获取所有的拓展信息
     *
     * @return 拓展信息
     */
    Map<String, Object> getExtInfo();

    /**
     * 设置拓展信息
     *
     * @param extInfo 拓展信息
     * @return ITsData
     */
    ITsData<T> setExtInfo(Map<String, Object> extInfo);

    /**
     * 获取拓展信息
     *
     * @param key key
     * @return Object
     */
    Object getExt(String key);

    /**
     * 添加拓展信息
     *
     * @param key key
     * @param obj 拓展对象
     * @return ITsData
     */
    ITsData<T> addExt(String key, Object obj);

    /**
     * 删除拓展信息
     *
     * @param key key
     * @return ITsData
     */
    ITsData<T> removeExt(String key);

    /**
     * 获取数据所属的acId
     *
     * @return acId
     */
    Long getAcId();

    /**
     * 设置AcId
     *
     * @param acId acId
     * @return ITsData
     */
    ITsData<T> setAcId(Long acId);

}
